// Ninf-G-XX, ver. 0.1
// Copyright 2011 National Institute of Advanced Industrial Science and Technology
// 
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// 
//     http://www.apache.org/licenses/LICENSE-2.0
// 
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#ifndef __NC_FUNCTION_ENTRY_H__
#define __NC_FUNCTION_ENTRY_H__

#include <cstdio>
#include <vector>
#include "FunctionInterfaceImpl.hpp"
#include "GenExpr.hpp"

namespace ninf {
	namespace lib {
/// represent function entry definition
		class FunctionEntry {
			void writeOutHeader(FILE * fp);
			void writeOutMain(FILE * fp);
			
			void writeOutFunctionName(const char * funcname, FILE * fp);
			void writeOutBody(FILE * fp);
			void writeOutGlobals(FILE * fp);
			void writeOutVarDecl(FILE * fp);
			int  findParam    (const char * paramName);
			void writeOutParam(const char * paramName, FILE * fp);
			void writeOutLen  (const char * paramName, FILE * fp);
			void writeOutSetArgs(FILE * fp);
			
			const char * fortranFormat(char * work, const char * format, const char * name);
			
		public:
			ninf::lib::FunctionInterfaceImpl interface;
			
			const char            * required;
			ninf::gen::GenBackend   backend;
			const char            * body;
			ninf::gen::GenExpr    * bodyExpr;
			const char            * language;
			
			std::vector <const char *>   paramNames;
			std::vector <const char *>   scalarParamNames;
			
			FunctionEntry():
				required(NULL), backend(ninf::gen::BACKEND_NORMAL), body(NULL),
				bodyExpr(NULL), language(NULL), paramNames(){}
			
			void writeOutStubProgram(FILE * fp);
			void generateStubProgram();
			
			void writeOutInfoFile(FILE * fp);
			void generateInfoFile();
		};
	}
}		
#endif
